package sql;

import com.mysql.cj.util.DataTypeUtil;
import org.apache.commons.lang3.ArrayUtils;
import utils.DateUtils;
import utils.ListUtils;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class SQLInsertBuilder {

    public static String buildSingleInsertSQL(String tableName, String[] columns, Object[] values) {
        StringBuilder sql = new StringBuilder("INSERT INTO ");
        sql.append(tableName).append(" (");
        // 构造字段名部分
        sql.append(String.join(", ", columns));
        sql.append(") VALUES (");
        // 构造值部分，注意对字符串进行转义
        sql.append(IntStream.range(0, values.length)
                .mapToObj(i -> {
                    String value = values[i].toString();
                    if (value.contains("'")) {
                        value = value.replace("'", "''");
                    }
                    return "'" + value + "'";
                })
                .collect(Collectors.joining(", ")));
        sql.append(")");
        return sql.toString();
    }

    /**
     * 构造批量插入语句。
     *
     * @param tableName 表名
     * @param columns   字段数组
     * @param rows      值的二维数组，每个数组代表一行的值
     * @return 构造的SQL批量插入语句
     */
    public static String buildBatchInsertSQL(String tableName, String[] columns, Object[][] rows) {
        if (rows.length == 0 || columns.length == 0) {
            return ""; // 如果没有数据或列，则返回空字符串
        }

        StringBuilder sql = new StringBuilder("INSERT INTO ");
        sql.append(tableName).append(" (");
        sql.append(String.join(", ", columns));
        sql.append(") VALUES ");

        // 构造值部分
        for (int i = 0; i < rows.length; i++) {
            if (i > 0) {
                sql.append(", ");
            }
            sql.append("(");
            for (int j = 0; j < rows[i].length; j++) {
                if (j > 0) {
                    sql.append(", ");
                }
                Object value = rows[i][j];
                // 转义字符串值中的单引号
                String safeValue = (value instanceof String) ?
                        ((String) value).replace("'", "''") : value.toString();
                sql.append("'").append(safeValue).append("'");
            }
            sql.append(")");
        }

        return sql.toString();
    }

    public static String buildSingleInsertSQL(String dbName,String tableName, List<String> columns, Object[] values) {
        if (values == null) {
            values = new Object[columns.size()];
            // 使用随机整数值填充values数组
            Random random = new Random();
            for (int i = 0; i < values.length; i++) {
                values[i] = DateUtils.getCurrentTimeFormatted("hh-mm-ss.SSS");
            }
        }

        StringBuilder sql = new StringBuilder("INSERT INTO ");
        sql.append(dbName).append(".").append(tableName).append(" (");
        // 构造字段名部分
        String columnsStr = String.join(", ", columns.toArray(new String[0]));
        sql.append(columnsStr);
        sql.append(") VALUES (");
        // 构造值部分，注意对字符串进行转义
        String valuesStr = Arrays.stream(values)
                .map(value -> {
                    String valueStr = (value == null) ? "NULL" : value.toString();
                    if (valueStr.contains("'")) {
                        valueStr = valueStr.replace("'", "''");
                    }
                    return "'" + valueStr + "'";
                })
                .collect(Collectors.joining(", "));
        sql.append(valuesStr);
        sql.append(")");
        return sql.toString();
    }

    public static String buildSingleInsertSQL(String dbName,String tableName, List<String> columns) {

        StringBuilder sql = new StringBuilder("INSERT INTO ");
        sql.append(dbName).append(".").append(tableName).append(" (");
        // 构造字段名部分
        String columnsStr = String.join(", ", columns.toArray(new String[0]));
        sql.append(columnsStr);
        sql.append(") VALUES (");
        // 构造值部分，注意对字符串进行转义
        for (int i = 0; i < columns.size(); i++) {
            if (i == columns.size() - 1){
                sql.append("? ");
                break;
            }
            sql.append("? ,");
        }
        sql.append(")");
        return sql.toString();
    }

    public static String buildSingleInsertSQL(String dbName, String tableName, List<String> columns, List<String> defaultValues, Object[] values) {

        StringBuilder sql = new StringBuilder("INSERT INTO ");
        sql.append(dbName).append(".").append(tableName).append(" (");
        // 构造字段名部分
        String columnsStr = String.join(", ", columns.toArray(new String[0]));
        sql.append(columnsStr);
        sql.append(") VALUES (");
        // 构造值部分，注意对字符串进行转义
        StringBuilder valuesStr = new StringBuilder();
        for (int i = 0; i < values.length; i++) {
            String valueStr = (values[i] == null) ? defaultValues.get(i) : values[i].toString();
            if (valueStr.contains("'")) {
                valueStr = valueStr.replace("'", "''");
            }
            if (i == values.length - 1) {
                valuesStr.append("'").append(valueStr).append("'");
                continue;
            }
            valuesStr.append("'").append(valueStr).append("'").append(",");
        }
        sql.append(valuesStr);
        sql.append(")");
        return sql.toString();
    }

}